package org.example.ctsbocc.service.impl;

import jakarta.annotation.Resource;
import org.example.ctsbocc.entity.User;
import org.example.ctsbocc.mapper.UserMapper;
import org.example.ctsbocc.service.UserService;
import org.example.ctsbocc.utils.LoggerUtil;
import org.example.ctsbocc.utils.HashUtil;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

/**
 * 用户服务实现类
 * 提供用户相关的业务逻辑处理
 */
@Service("userService")
public class UserServiceImpl implements UserService {

    @Resource(name = "userMapper")
    private UserMapper userMapper;

    /**
     * 用户注册
     * 将新用户信息插入数据库
     *
     * @param user 用户实体对象
     * @return 受影响的行数，1表示插入成功，0表示插入失败
     */
    @Override
    public int register(User user) {
        // 对用户密码进行SHA256加密处理
        user.setPassword(HashUtil.generateSHA256Hash(user.getPassword()));
        // 检查用户名是否已存在
        if (userMapper.selectByGitUsername(user.getGitUsername(), user.getPassword()) != null) {
            LoggerUtil.log().warn("用户 {} 注册失败, 用户名已存在", user.getGitUsername());
            return 0;
        }
        // 设置默认头像路径
        user.setAvatarPath("default.jpeg");
        // 设置创建时间和更新时间
        user.setCreatedAt(LocalDateTime.now());
        user.setUpdatedAt(LocalDateTime.now());
//        LoggerUtil.log().info("用户 {} 注册开始", user.getGitUsername());
        // 执行用户插入操作
        return userMapper.insert(user);
    }

    /**
     * 根据用户ID查询用户信息
     *
     * @param userId 用户编号
     * @return 用户实体对象，如果未找到返回null
     */
    @Override
    public User selectById(Long userId) {
        return userMapper.selectById(userId);
    }

    /**
     * 根据Git用户名查询用户信息
     *
     * @param gitUsername Git账户名
     * @param password 密码
     * @param verificationCode 用户输入的验证码
     * @param rightCode 正确的验证码
     * @return 用户实体对象，如果未找到返回null
     */
    @Override
    public User selectByGitUsername(String gitUsername, String password, String verificationCode, String rightCode) {

        // 验证用户输入的验证码是否正确
        if (!verificationCode.equals(rightCode)) {
            LoggerUtil.log().warn("用户 {} 登陆失败, 验证码错误", gitUsername);
            return null;
        }

        // 对用户密码进行SHA256加密处理
        password = HashUtil.generateSHA256Hash(password);
        // 从数据库查询用户信息
        User user = userMapper.selectByGitUsername(gitUsername, password);
        if (user == null) {
//            LoggerUtil.log().warn("用户 {} 登陆失败, 用户名或密码错误", gitUsername);
            return null;
        }
        // 补全用户头像的完整路径
        user.setAvatarPath(avatarPathComplete(user.getAvatarPath()));
        return user;
    }

    /**
     * 根据邮箱查询用户信息
     *
     * @param email 邮箱账号
     * @return 用户实体对象，如果未找到返回null
     */
    @Override
    public User selectByEmail(String email) {
        // 调用Mapper根据邮箱查询用户
        return userMapper.selectByEmail(email);
    }

    /**
     * 更新用户信息
     *
     * @param user 用户实体对象
     * @return 受影响的行数，1表示更新成功，0表示更新失败
     */
    @Override
    public int update(User user) {
        // 调用Mapper更新用户信息
        return userMapper.update(user);
    }

    /**
     * 根据用户ID删除用户
     *
     * @param userId 用户编号
     * @return 受影响的行数，1表示删除成功，0表示删除失败
     */
    @Override
    public int deleteById(Long userId) {
        // 调用Mapper删除用户
        return userMapper.deleteById(userId);
    }

    /**
     * 补全用户头像路径
     * 将相对路径转换为绝对路径
     *
     * @param avatarPath 头像相对路径
     * @return 头像完整路径
     */
    private static String avatarPathComplete(String avatarPath) {
        // 定义头像存储的基础路径
        String pre = "http://localhost:8080/";
        // 拼接完整路径
        return pre + avatarPath;
    }
}
